๋ฆฌ๋ˆ…์Šค ์ปค๋„ (3) - ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ

2019-11-28

ํ”„๋กœ์„ธ์Šค

ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ(ํŠน์ • ๋งค์ฒด์— ์ €์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ ์ฝ”๋“œ)
ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ, ๋Œ€๊ธฐ ์ค‘์ธ ์‹œ๊ทธ๋„, ์ปค๋„ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ, ํ”„๋กœ์„ธ์„œ ์ƒํƒœ, ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„, ์‹คํ–‰ ์ค‘์ธ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ ์ •๋ณด, ์ „์—ญ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋“ฑ ๋ชจ๋“  ์ž์›์„ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…

์‚ฌ์‹ค์ƒ ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ƒ๊ธฐ๋Š” ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฌผ

์ปค๋„์€ ์ด ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํˆฌ๋ช…ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ

์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ(๋ณดํ†ต ์ค„์—ฌ์„œ ์Šค๋ ˆ๋“œ๋ผ ์นญํ•˜๋Š”)๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฐ์ฒด
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๊ฐœ๋ณ„์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ์™€ ํ”„๋กœ์„ธ์Šค ์Šคํƒ, ํ”„๋กœ์„ธ์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

์ปค๋„์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Šค์ผ€์ค„๋ง ํ•จ

์ „ํ†ต์ ์ธ ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ : ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ
ํ˜„๋Œ€ ์‹œ์Šคํ…œ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ ๋งŒ์—ฐ

๋ฆฌ๋ˆ…์Šค๋Š” ๋…ํŠนํ•œ ๋ฐฉ์‹์œผ๋กœ ์Šค๋ ˆ๋“œ ๊ตฌํ˜„
๋ฆฌ๋ˆ…์Šค๋Š” ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ ๊ตฌ๋ถ„ ์•ˆํ•จ
๋ฆฌ๋ˆ…์Šค์—์„œ ์Šค๋ ˆ๋“œ๋Š” ์กฐ๊ธˆ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ํ”„๋กœ์„ธ์Šค์ผ ๋ฟ

ํ˜„๋Œ€ ์šด์˜์ฒด์ œ์—์„œ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ€์ƒ ํ”„๋กœ์„ธ์„œ์™€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ œ๊ณต
๊ฐ€์ƒ ํ”„๋กœ์„ธ์„œ๋Š” ์‹ค์ œ๋กœ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋„, ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ผ์ž ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๋“ฏํ•œ ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ œ๊ณต
๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ์˜ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ˜ผ์ž ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

์Šค๋ ˆ๋“œ๋Š” ๊ฐ์ž ๊ณ ์œ ํ•œ ๊ฐ€์ƒ ํ”„๋กœ์„ธ์„œ๋ฅผ ํ• ๋‹น๋ฐ›์ง€๋งŒ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณต์œ ํ•จ

ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹˜
ํ”„๋กœ์„ธ์Šค๋Š” ์ž‘๋™ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๊ทธ์™€ ๊ด€๋ จ๋œ ์ž์›์„ ๋œปํ•จ
๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํ•˜๋Š” ๋‘˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค ์กด์žฌ ๊ฐ€๋Šฅ
์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์ด ํŒŒ์ผ ์‚ฌ์šฉ, ์ฃผ์†Œ ๊ณต๊ฐ„ ๋“ฑ์˜ ์ž์› ๊ณต์œ  ๊ฐ€๋Šฅ

ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ์„ฑ๋˜๋ฉด์„œ ์ƒ์„ ์‹œ์ž‘
๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง
fork()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค, ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จ
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜๋œ ์ง€์ ์—์„œ ์‹คํ–‰์„ ๊ณ„์†, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋„ ๊ฐ™์€ ์œ„์น˜์—์„œ ์‹คํ–‰ ์‹œ์ž‘
์ฆ‰, fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•œ ๋ฒˆ, ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•œ ๋ฒˆ, ์ด ๋‘ ๋ฒˆ ๋ฐ˜ํ™˜์ด ์ผ์–ด๋‚จ

๋Œ€๊ฐœ์˜ ๊ฒฝ์šฐ forkํ•œ ์งํ›„ ๋‹ค๋ฅธ ์ƒˆ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
exec() ๊ณ„์—ด์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ƒˆ๋กœ์šด ์ฃผ์†Œ ๊ณต๊ฐ„ ๋งŒ๋“ค๊ณ  ์ƒˆ ํ”„๋กœ๊ทธ๋žจ ๋ถˆ๋Ÿฌ๋“ค์ผ ์ˆ˜ ์žˆ์Œ
๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์‹ค์ œ๋กœ๋Š” clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ๊ตฌํ˜„๋จ

ํ”„๋กœ๊ทธ๋žจ์€ exit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ข…๋ฃŒ๋จ
์ด ํ•จ์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์ž์› ๋ฐ˜๋‚ฉ
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ํŠน์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” wait4() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ƒํƒœ ํ™•์ธ ๊ฐ€๋Šฅ

  • ์ปค๋„์ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ wait4() ์‹œ์Šคํ…œ ํ˜ธ์ถœ. ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜์ ์ธ wait(), waitpid(), wait3(), wait4() ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•จ. ๊ฐ ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด์ง€๋งŒ ๋ชจ๋‘ ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ์ •๋ณด ์ œ๊ณตํ•จ
  • ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฅธ ๋ง๋กœ ํƒœ์Šคํฌ(task, ์ž‘์—…)๋ผ๊ณ ๋„ ๋ถ€๋ฆ„. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋‚ด๋ถ€์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํƒœ์Šคํฌ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒฝ์šฐ ๋งŽ์Œ. ๋ณดํ†ต ์ปค๋„ ๊ด€์ ์—์„œ ํ”„๋กœ์„ธ์Šค ์ง€์นญ ์‹œ ํƒœ์Šคํฌ๋ผ๋Š” ์šฉ์–ด ์‚ฌ์šฉ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์™€ ํƒœ์Šคํฌ ๊ตฌ์กฐ์ฒด

์ปค๋„์€ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์„ ํƒœ์Šคํฌ ๋ฆฌ์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํ™˜ํ˜• ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ €์žฅ(ํƒœ์Šคํฌ ๋ฐฐ์—ด๋กœ ๋ถ€๋ฅด๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ ํƒœ์Šคํฌ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ ์ ˆ)
ํƒœ์Šคํฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์€ <linux/sched.h>์— ์ •์˜๋œ struct task_struct ํ˜•์‹์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋ผ๊ณ  ๋ถ€๋ฆ„
ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์—๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ์Œ

task_struct ๊ตฌ์กฐ์ฒด๋Š” 32๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ์•ฝ 1.7KB์˜ ์ƒ๋‹นํžˆ ํฐ ๊ตฌ์กฐ์ฒด
์ปค๋„์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆ ์‹œ ์ด ํฌ๊ธฐ๋Š” ์ž‘์€ ๊ฒƒ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์—๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ, ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„, ๋Œ€๊ธฐ ์ค‘์ธ ์‹œ๊ทธ๋„, ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ๋“ฑ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๋ช…ํ•˜๋Š” ๋งŽ์€ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ์Œ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์˜ ํ• ๋‹น

task_struct ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ ๋ฐ ์บ์‹œ ์ปฌ๋Ÿฌ๋ง ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์Šฌ๋žฉ ํ• ๋‹น์žslab allocator๋ฅผ ์‚ฌ์šฉํ•ด ํ• ๋‹น

2.6 ์ปค๋„ ์ด์ „์—๋Š” task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋„ ์Šคํƒ ๋ ๋ถ€๋ถ„์— ์ €์žฅํ–ˆ์Œ
(์ด๋ ‡๊ฒŒ ํ•˜๋ฉด x86์ฒ˜๋Ÿผ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์ ์€ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ตฌ์กฐ์ฒด ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํƒ ํฌ์ธํ„ฐ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์œ„์น˜ ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ–ˆ์—ˆ์Œ)
์ด์ œ๋Š” ์Šฌ๋žฉ ํ• ๋‹น์ž ์ด์šฉ ๋™์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— thread_info๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๋ฅผ ์Šคํƒ์ด ์•„๋ž˜์ชฝ์œผ๋กœ ํ™•์žฅ ์‹œ ์Šคํƒ ๋ฐ‘๋ฐ”๋‹ฅ, ์œ„์ชฝ์œผ๋กœ ํ™•์žฅ ์‹œ ์Šคํƒ ๊ผญ๋Œ€๊ธฐ์— ๋Œ€์‹  ๋‘ 

  • ๋ ˆ์ง€์Šคํ„ฐ ๋ถ€์กฑ ์‹œ์Šคํ…œ ์œ„ํ•ด์„œ๋งŒ ์•„๋‹ˆ๋ผ thread_info ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ์œผ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’ ์˜คํ”„์…‹ ๊ณ„์‚ฐ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

๊ฐ ํƒœ์Šคํฌ์˜ thread_info ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœ์„ธ์Šค ์Šคํƒ์˜ ์ œ์ผ ๋๋ถ€๋ถ„์— ํ• ๋‹น๋จ
๊ตฌ์กฐ์ฒด์˜ task ํฌ์ธํ„ฐ๊ฐ€ ํƒœ์Šคํฌ์˜ ์‹ค์ œ task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์ €์žฅ

์‹œ์Šคํ…œ์€ ๊ณ ์œ ํ•œ ํ”„๋กœ์„ธ์Šค ์ธ์‹ ๋ฒˆํ˜ธ(PID)๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ์„ธ์Šค ๊ตฌ๋ณ„ํ•จ
PID๋Š” pid_t๋ผ๋Š” ๋ถ€์ •ํ˜•opaque์˜ ์ˆซ์ž ๊ฐ’์œผ๋กœ, ๋ณดํ†ต์€ ์‹ค์ œ๋กœ int ํ˜• ์‚ฌ์šฉํ•จ
ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ ์œ ๋‹‰์Šค ๋ฐ ๋ฆฌ๋ˆ…์Šค์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ PID ์ตœ๋Œ€๊ฐ’์€ ๊ธฐ๋ณธ์ ์œผ๋กœ (short int ์ตœ๋Œ€๊ฐ’์ธ) 32,768์ด๋ฉฐ, ์ด ๊ฐ’์€ ์„ ํƒ์ ์œผ๋กœ(<linux/thread.h> ํŒŒ์ผ์„ ํ†ตํ•ด) 400๋งŒ์œผ๋กœ ์ƒํ–ฅ ์กฐ์ • ๊ฐ€๋Šฅ
์ปค๋„์€ PID ๊ฐ’์„ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์˜ pid ํ•ญ๋ชฉ์— ์ €์žฅ

  • ๋ถ€์ •ํ˜•์€ ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ํ‘œํ˜„ํ˜• ์•Œ๋ ค์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์‹ค์ œ ํ‘œํ˜„ํ˜• ๋…ธ์ถœํ•  ํ•„์š” ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ˜•์ด๋‹ค.

๊ทผ๋ณธ์ ์œผ๋กœ PID ์ตœ๋Œ€๊ฐ’์€ ์‹œ์Šคํ…œ์— ๋™์‹œ์— ์กด์žฌํ•  ์ˆ˜ ์ด์“ด ์ตœ๋Œ€ ํ”„๋กœ์„ธ์Šค ์ˆ˜
์ผ๋ฐ˜ ๋ฐ์Šคํฌํƒ‘ ์‹œ์Šคํ…œ์€ 32,768๊ฐœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๋Œ€์šฉ๋Ÿ‰ ์„œ๋ฒ„์—์„œ๋Š” ๋” ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
์ตœ๋Œ€๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ์ƒํ•ญ์„ ๋„˜์–ด ๋‹ค์‹œ ๋‚ฎ์€ PID๊ฐ’ ํ• ๋‹น๋˜๋Š” ์ƒํ™ฉ ๋นจ๋ฆฌ ๋Œ์•„์˜ด
=> ์ด ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋งŒ๋“  ํ”„๋กœ์„ธ์Šค PID๊ฐ€ ํฐ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๋Š” ์œ ์šฉํ•œ ์ •๋ณด ์‚ฌ๋ผ์ง

์˜ค๋ž˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๊ณ ๋ คํ•  ํ•„์š” ์—†๋‹ค๋ฉด, ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ /proc/sys/kernel/pid_max ๊ฐ’ ์ˆ˜์ •ํ•ด ์ตœ๋Œ€๊ฐ’ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ

์ปค๋„ ๋‚ด๋ถ€์—์„œ ํƒœ์Šคํฌ์— ์ ‘๊ทผํ•  ๋•Œ ๋ณดํ†ต task_struct ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ
๋”ฐ๋ผ์„œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ๋ฐฉ๋ฒ• ํ•„์š” => current ๋งคํฌ๋กœ๊ฐ€ ์ด ์—ญํ• ์„ ํ•จ

current ๋งคํฌ๋กœ : ์•„ํ‚คํ…์ฒ˜๋ณ„๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋จ
์–ด๋–ค ์•„ํ‚คํ…์ฒ˜๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ task_struct ํฌ์ธํ„ฐ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•ด ๋‘๊ณ  ์ ‘๊ทผํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ์‹์„ ์“ธ ์ˆ˜ ์žˆ์Œ
(๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์•„๊ปด์•ผ ํ•˜๋Š”)x86 ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” thread_info ๊ตฌ์กฐ์ฒด๊ฐ€ ์ปค๋„ ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•ด thread_info ๊ตฌ์กฐ์ฒด์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ด๋‚ด๊ณ , ์ด๋ฅผ ํ†ตํ•ด task_struct์˜ ์œ„์น˜ ์•Œ์•„๋ƒ„

x86์˜ current ๋งคํฌ๋กœ๋Š” ์Šคํƒ ํฌ์ธํ„ฐ์˜ ํ•˜์œ„ 13๋น„ํŠธ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ thread_info ๊ตฌ์กฐ์ฒด ์œ„์น˜ ๊ณ„์‚ฐํ•ด๋ƒ„
current_thread_info() ํ•จ์ˆ˜๊ฐ€ ์ด ์—ญํ• ์„ ๋‹ด๋‹นํ•จ

movl $-8192, %eax
andl %esp, %esp

์ด ์ฝ”๋“œ๋Š” ์Šคํƒ ํฌ๊ธฐ๊ฐ€ 8KB๋ผ๊ณ  ๊ฐ€์ •ํ•จ. 4KB ์Šคํƒ ์‚ฌ์šฉ ์‹œ 8192 ๋Œ€์‹  4096์„ ์‚ฌ์šฉ.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด current ๋งคํฌ๋กœ๋Š” thread_info์˜ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•ด task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

current_thread_info()->task;

IBM์˜ RISC๊ธฐ๋ฐ˜ PowerPC์—์„œ๋Š” ์ด์™€ ๋‹ค๋ฅธ ๋ฐฉ์‹ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ ˆ์ง€์Šคํ„ฐ์— ํ˜„์žฌ task_struct ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹ ์‚ฌ์šฉํ•จ
๋”ฐ๋ผ์„œ PPC์—์„œ current ๋งคํฌ๋กœ๋Š” r2 ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ณ  ์ค‘์š”ํ•œ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ณ„๋„ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ• ๋‹นํ•  ๋งŒํ•œ ์ž‘์—…์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ

ํ”„๋กœ์„ธ์Šค ์ƒํƒœ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์˜ state ํ•ญ๋ชฉ์€ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜ํ•œ ํ™˜๊ฒฝ์„ ์•Œ๋ ค์คŒ
์‹œ์Šคํ…œ์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์ •ํ™•ํžˆ ๋‹ค์„ฏ ๊ฐ€์ง€ ์ƒํƒœ ์ค‘ ํ•˜๋‚˜์— ์žˆ์Œ
๊ฐ ์ƒํƒœ๊ฐ’์€ ๋‹ค์Œ ๋‹ค์„ฏ ๊ฐ€์ง€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„

  • TASK_RUNNING - ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ์ƒํƒœ. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค๋Š” ์ด ์ƒํƒœ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ. ์ปค๋„ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋„ ์ด ์ƒํƒœ์— ์†ํ•จ.
  • TASK_INTERRUPTIBLE - ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŠน์ • ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์‰ฌ๋Š” ์ค‘์ž„(์ค‘๋‹จ). ๊ธฐ๋‹ค๋ฆฌ๋Š” ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ์ปค๋„์€ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ TASK_RUNNING์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๊ทธ๋„์„ ๋ฐ›์€ ๊ฒฝ์šฐ์—๋Š” ์กฐ๊ฑด์— ์ƒ๊ด€์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ฐ”๋€œ.
  • TASK_UNINTERRUPTIBLE - ์‹œ๊ทธ๋„์„ ๋ฐ›์•„๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์  ์ œ์™ธํ•˜๋ฉด TASK_INTERRUPTIBLE ์ƒํƒœ์™€ ๊ฐ™์Œ. ์ด ์ƒํƒœ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๊ณ  ํŠน์ • ์กฐ๊ฑด์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ๋‹ค๋ฆฌ๋Š” ์กฐ๊ฑด์ด ๊ธˆ๋ฐฉ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ. ์ด ์ƒํƒœ์— ์žˆ๋Š” ํƒœ์Šคํฌ๋Š” ์‹œ๊ทธ๋„์— ์‘๋‹ต ์•ˆ ํ•˜๋ฏ€๋กœ(์ด๊ฒƒ ๋•Œ๋ฌธ์— ps(1) ๋ช…๋ น ๊ฒฐ๊ณผ์— D ์ƒํƒœ๋กœ ใ…์‹œ๋˜๋Š” ์ฃฝ์ผ ์ˆ˜ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ์ด์œ . ์ž‘์—…์ด ์‹œ๊ทธ๋„์— ์‘๋‹ต ์•ˆ ํ•˜๋ฏ€๋กœ SIGKILL ์‹œ๊ทธ๋„ ๋ณด๋‚ผ ์ˆ˜ ์—†์Œ. ๊ฒŒ๋‹ค๊ฐ€, ์ž‘์—… ์ข…๋ฃŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด๋„ ์ค‘์š”ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์„ธ๋งˆํฌ์–ด ์‚ฌ์šฉ ์ž‘์—…์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ข…๋ฃŒ ์•ˆ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์ง), ์ด ํ”Œ๋ž˜๊ทธ๋Š” TASK_INTERRUPTIBLE๋งŒํผ ์ž์ฃผ ์‚ฌ์šฉ ์•ˆ ํ•จ.
  • __TASK_TRACED - ๋””๋ฒ„๊ฑฐ ๋“ฑ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ptrace๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”์ ํ•˜๋Š” ์ƒํƒœ
  • __TASK_STOPPED - ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์ด ์ •์ง€๋œ ์ƒํƒœ. ํ•ด๋‹น ํƒœ์Šคํฌ๋Š” ์‹คํ–‰ ์ค‘์ด์ง€๋„ ์•Š๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋„ ์•„๋‹˜. ์ž‘์—…์ด SIGSTOP, SGTSTP, SIGTTIN, SIGTTOU ๊ฐ™์€ ์‹œ๊ทธ๋„์„ ๋ฐ›์€ ๊ฒฝ์šฐ ๋””๋ฒ„๊ทธ ์ค‘์— ์‹œ๊ทธ๋„์„ ๋ฐ›์€ ๊ฒฝ์šฐ์— ์ด ์ƒํƒœ๊ฐ€ ์ด ์ƒํƒœ๊ฐ€ ๋จ.

ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ์กฐ์ž‘

์ปค๋„ ์ฝ”๋“œ์—์„œ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ ๋งŽ์Œ.
๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅ

set_task_state(task, state); // ํƒœ์Šคํฌ 'task'์˜ ์ƒํƒœ๋ฅผ 'state' ์ƒํƒœ๋กœ ์„ค์ •

์ด ํ•จ์ˆ˜๋Š” ํŠน์ • ํƒœ์Šคํฌ์˜ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•œ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ด ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋Šฅ ์ด์šฉ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์™€ ์ž‘์—… ์ˆœ์„œ ๊ฒน์น˜๋Š” ๊ฒƒ ๋ฐฉ์ง€(๋Œ€์นญํ˜• ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ์‹œ์Šคํ…œ์—์„œ ์ด ๊ธฐ๋Šฅ ํ•„์š”).

๋Œ€์นญํ˜• ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ์‹œ์Šคํ…œ ๊ฒฝ์šฐ ๊ณ ๋ คํ•  ๊ฒƒ์„ ๋นผ๋ฉด ์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๋™์ž‘์„ ํ•จ

task->state = state;

set_current_state(state) ํ•จ์ˆ˜๋Š” set_task_state(current, state) ํ•จ์ˆ˜์™€ ๊ฐ™์Œ.
ํ•ด๋‹น ํ•จ์ˆ˜ ๊ตฌํ˜„์€ <linux/sched.h> ์ฐธ๊ณ 

ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ

ํ”„๋กœ์„ธ์Šค์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ
์‹คํ–‰ ํŒŒ์ผ์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๋“ค์ด๊ณ , ํ”„๋กœ๊ทธ๋žจ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์ฝ”๋“œ ์‹คํ–‰ํ•จ
์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋จ
ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐœ์ƒ ์‹œ, ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋„ ๊ณต๊ฐ„์œผ๋กœ ์ง„์ž…ํ•จ
์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ปค๋„์ด 'ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์‹ ํ•ด ์‹คํ–‰ ์ค‘' ๋˜๋Š” '์ปค๋„์ด ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ์— ์žˆ์Œ'์ด๋ผ๊ณ  ํ•จ
ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ์— ์žˆ์„ ๋•Œ current ๋งคํฌ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๊ทธ ์‚ฌ์ด์— ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜์–ด ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ทธ ํ”„๋กœ์„ธ์Šค ๋จผ์ € ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ปค๋„์ด ์ž‘์—… ๋๋‚ด๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰ ๊ณ„์†ํ•จ

์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ž˜ ์ •์˜๋œ ์ปค๋„ ์ง„์ž… ์ธํ„ฐํŽ˜์ด์Šค์ž„
ํ”„๋กœ์„ธ์Šค๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ์ปค๋„ ๊ณต๊ฐ„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
์ฆ‰, ์ปค๋„์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์ด ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์•ผ๋งŒ ํ•จ

ํ”„๋กœ์„ธ์Šค ๊ณ„์ธต ํŠธ๋ฆฌ

์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋ฆฌ๋ˆ…์Šค๋„ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋…ํŠนํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ์กด์žฌ
๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” PID๊ฐ€ 1์ธ init ํ”„๋กœ์„ธ์Šค์˜ ์ž์†์ž„
init ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€ํŠธ ๊ณผ์ •์˜ ์ตœ์ข… ๋‹จ๊ณ„์—์„œ ์ปค๋„์ด ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž„
๊ทธ ๋‹ค์Œ init ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์Šคํ…œ์˜ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด ๋” ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ์ผœ ๋ถ€ํŠธ ๊ณผ์ • ์™„๋ฃŒํ•จ

์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง
๋˜ํ•œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
๊ฐ™์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง€๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜•์ œ ํ”„๋กœ์„ธ์Šคsibling๋ผ๊ณ  ๋ถ€๋ฆ„
ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ๊ด€๊ณ„๋Š” ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์— ์ €์žฅ๋จ
๊ฐ task_struct ๊ตฌ์กฐ์ฒด์—๋Š” ๋ถ€๋ชจ์˜ task_struct๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” parent๋ผ๋Š” ํฌ์ธํ„ฐ์™€ ์ž์‹์˜ task_struct ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” children ํฌ์ธํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ์Œ

ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ด์šฉ ์‹œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์–ป๊ธฐ ๊ฐ€๋Šฅ

struct task_struct *my_parent = current->parent;

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

struct task_struct *task;
struct list_head *list;

list_for_each(list, &current->children) {
	task = list_entry(list, struct task_struct, sibling);
	// ์ด์ œ task๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด 
}

init ํƒœ์Šคํฌ์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋Š” init_task๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ •์ ์œผ๋กœ ํ• ๋‹น๋จ

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์คŒ

struct task_struct *task;

for (task = current; task != &init_task; task = task->parent)
	;
// task๊ฐ€ init์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

ํ”„๋กœ์„ธ์Šค ๊ณ„์ธต ๊ตฌ์กฐ ์ด์šฉ ์‹œ ์‹œ์Šคํ…œ์˜ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๋‹ค๋ฅธ ํŠน์ • ํ”„๋กœ์„ธ์Šค ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ์Œ
์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ํ›‘๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” ์ž‘์—…(ํƒœ์Šคํฌ) ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ™˜ํ˜• ์–‘๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ž‘์—… ๊ฐ€๋Šฅ

์–ด๋–ค ํƒœ์Šคํฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋จ

list_entry(task->tasks.next,  struct task_struct, tasks)

์ด์ „ ํƒœ์Šคํฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰

list_entry(task->tasks.prev,  struct task_struct, tasks)

์œ„ ๋‘ ๊ฐ€์ง€ ๋ฃจํ‹ด์€ next_task(task)์™€ prev_task(task)๋ผ๋Š” ๋งคํฌ๋กœ๋กœ ์ œ๊ณต๋จ

์ „์ฒด ํƒœ์Šคํฌ ์—ด๊ฑฐํ•˜๋Š” for_each_process(task) ๋งคํฌ๋กœ(๋ฐ˜๋ณต ๋‹จ๊ณ„๋งˆ๋‹ค task ํฌ์ธํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ ํƒœ์Šคํฌ ๊ฐ€๋ฆฌํ‚ด)

struct task_struct *task;

for_each_process(task) {
	// ๋งคํฌ๋กœ์˜ ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค ๊ฐ ํƒœ์Šคํฌ์˜ ์ด๋ฆ„๊ณผ PID ์ถœ๋ ฅ๋จ
	printk("%s[%d]\n", task->comm, task->pid);
}

๋ชจ๋“  ํƒœ์Šคํฌ ์—ด๊ฑฐํ•˜๋Š” ์ผ์€ ๋งค์šฐ ๋ถ€ํ•˜๊ฐ€ ํฐ ์ž‘์—…์ž„

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

๋Œ€๋ถ€๋ถ„ OS๋Š” ์Šคํฐspawn ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ƒˆ ํ”„๋กœ์„ธ์Šค ๋งŒ๋“ค๊ณ , ์‹คํ–‰ ํŒŒ์ผ ์ฝ์€ ํ›„ ๊ทธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

์œ ๋‹‰์Šค๋Š” ๋…ํŠนํ•˜๊ฒŒ ์ด ๊ณผ์ •์„ fork()์™€ exec()์ด๋ผ๋Š” ๋‘ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

  • ์—ฌ๊ธฐ์„œ exec() ํ•จ์ˆ˜๋Š” exec() ํ•จ์ˆ˜ ๊ตฐ์„ ์ผ์ปฌ์Œ. ์ปค๋„์€ execve() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ฐ”ํƒ•์œผ๋กœ execlp(), execle(), execv(), execvp() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•จ.

๋จผ์ € fork()๋Š” ํ˜„์žฌ ํƒœ์Šคํฌ๋ฅผ ๋ณต์ œํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ฆ
์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์„ธ์Šค๋Š” (๊ณ ์œ ๊ฐ’์„ ๊ฐ–๋Š”)PID์™€ (๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค PID์ธ)PPID, ์ƒ์†๋˜์ง€ ์•Š๋Š” ์ง€์—ฐ๋œ ์‹œ๊ทธ๋„๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ž์›๊ณผ ํ†ต๊ณ„ ์ˆ˜์น˜ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถ€๋ชจ์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง
๋‹ค์Œ ํ•จ์ˆ˜์ธ exec()์€ ์ƒˆ๋กœ์šด ์‹คํ–‰ํŒŒ์ผ์„ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ด๋ฅผ ์‹คํ–‰
fork() ๋‹ค์Œ์— exec()์„ ์‹คํ–‰ํ•˜๋Š” ์กฐํ•ฉ์€ ๋Œ€๋ถ€๋ถ„ OS์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์ œ๊ณต

Copy-on-Write

์ „ํ†ต์ ์ธ fork()๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์ž์› ๋ณต์‚ฌํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋„˜๊ฒจ์คŒ
์ด๋Ÿฐ ๋ฐฉ์‹์€ ๊ณต๊ทœ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋ฏ€๋กœ ๋‹จ์ˆœํ•˜๊ณ  ๋น„ํšจ์œจ์ 
๊ฒŒ๋‹ค๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ”๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณต์‚ฌ ์ž‘์—…์ด ๋ชจ๋‘ ํ—›์ˆ˜๊ณ ๊ฐ€ ๋จ
๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” 'copy-on-write(๊ธฐ๋ก์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ ๋ณต์‚ฌ)' ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•ด fork() ํ•จ์ˆ˜ ๊ตฌํ˜„ํ–ˆ์Œ
๊ธฐ๋ก์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ ๋ณต์‚ฌCOW, Copy-on-Write ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋ฅผ ์ง€์—ฐ ๋˜๋Š” ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ž„
ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๊ณต๊ฐ„ ๊ณต์œ ํ•จ

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ก์‚ฌํ•ญ ๋ฐœ์ƒํ•ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ•„์š” ์‹œ ๊ทธ ์ˆœ๊ฐ„ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณ„๋„์˜ ๋‚ด์šฉ ๊ฐ€์ง€๊ฒŒ ๋จ
๋”ฐ๋ผ์„œ ๋ฆฌ์†Œ์Šค ๋ณต์‚ฌ๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ผ์–ด๋‚จ
๊ทธ๋•Œ๊นŒ์ง€๋Š” ์ฝ๊ธฐ์ „์šฉ ์ƒํƒœ๋กœ ๊ณต์œ  ๊ฐ€๋Šฅ
์ด ๊ธฐ๋ฒ•์€ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์‹ค์ œ ๊ธฐ๋ก ์ž‘์—… ์ผ์–ด๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ ํŽ˜์ด์ง€์˜ ๋ณต์‚ฌ ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ด
ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ˆ๋Œ€ ๊ธฐ๋ก์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, e.g. fork() ์งํ›„์— exec() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณต์‚ฌ๊ฐ€ ํ•„์š” ์—†์–ด์ง

fork() ํ•จ์ˆ˜๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ, ์ž์‹ ํ”„๋กœ์„ธ์Šค์šฉ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ๋ฟ์ž„
์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ์„ฑ๋œ ๋‹ค์Œ ๋‹ค๋ฅธ ์‹คํ–‰ํŒŒ์ผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ์ด ๊ฐ™์€ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋งŽ์€ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋‚ญ๋น„๋ฅผ ๋ง‰์Œ
์œ ๋‹‰์Šค์˜ ์ฒ ํ•™์ธ ๋น ๋ฅธ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์— ๋ถ€ํ•ฉ

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

๋ฆฌ๋ˆ…์Šค๋Š” clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ด์šฉ fork() ๊ตฌํ˜„
clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋‹ค์–‘ํ•œ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ๊ณต์œ ๊ฐ€ ํ•„์š”ํ•œ ์ž์› ์ง€์ •
fork(), vfork(), __clone() ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ๊ฐ์ž ์ ์ ˆํ•œ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉํ•ด clone()์„ ํ˜ธ์ถœํ•จ
clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋‹ค์‹œ do_fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

์‹ค์ œ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ž‘์—…์€ kernel/fork.c์— ์ •์˜๋œ do_fork() ํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌํ•จ
์ด ํ•จ์ˆ˜๋Š” copy_process() ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ์‹œ์ž‘ํ•จ
copy_process() ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  1. dup_task_struct() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ปค๋„ ์Šคํƒ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , ์ƒˆ ํ”„๋กœ์„ธ์Šค์šฉ thread_info, task_struct ๊ตฌ์กฐ์ฒด ๋งŒ๋“ฆ. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์€ ํ˜„์žฌ ํƒœ์Šคํฌ์™€ ๋™์ผํ•จ. ์ด ์‹œ์ ์— ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋Š” ๊ฐ™์Œ.
  2. ์ƒˆ๋กœ ๋งŒ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ์ธํ•ด ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜ ์ œํ•œ์„ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”์ง€ ํ™•์ธ.
  3. ์ด์ œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ€๋ชจ์™€ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•จ. ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์˜ ๋‹ค์–‘ํ•œ ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•จ. ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์—์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ’์„ ๋ฌผ๋ ค๋ฐ›์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ ์ฃผ๋กœ ํ†ต๊ณ„ ์ •๋ณด. ๋Œ€๋ถ€๋ถ„์˜ task_struct ํ•ญ๋ชฉ ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š์Œ.
  4. ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ TASK_UNINTERRUPTIBLE๋กœ ์„ค์ •ํ•ด ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š๊ฒŒ ํ•จ.
  5. copy_process()๋Š” copy_flag() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด task_struct ๊ตฌ์กฐ์ฒด์˜ flags ๋‚ด์šฉ์„ ์ •๋ฆฌํ•จ. ์ž‘์—…์ด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋œปํ•˜๋Š” PF_SUPERPRIV ํ”Œ๋ž˜๊ทธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•จ. ํ”„๋กœ์„ธ์Šค๊ฐ€ exec() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜์Œ์„ ๋œปํ•˜๋Š” PF_FORKNOEXEC ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•จ.
  6. alloc_pid() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ƒˆ๋กœ ๋งŒ๋“  ํƒœ์Šคํฌ์— ์ƒˆ๋กœ์šด PID ๊ฐ’์„ ํ• ๋‹นํ•จ.
  7. clone() ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ํ”Œ๋ž˜๊ทธ ๊ฐ’์— ๋”ฐ๋ผ copy_process()๋Š” ์—ด๋ฆฐ ํŒŒ์ผ ๋ฐ ํŒŒ์ผ์‹œ์Šคํ…œ ์ •๋ณด, ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ, ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šคnamespace ๋“ฑ์„ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ํ•จ. ๋ณดํ†ต ์Šค๋ ˆ๋“œ ์‚ฌ์ด์—์„œ๋Š” ์ด๋Ÿฐ ์ž์›์„ ๊ณต์œ ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด ๋‹จ๊ณ„์—์„œ ๋ณต์ œํ•จ.
  8. ๋งˆ์ง€๋ง‰์œผ๋กœ copy_process()๋Š” ๋‚˜๋จธ์ง€ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ˜ธ์ถœํ•œ ์ชฝ์— ์ƒˆ๋กœ ๋งŒ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

do_fork()๋กœ ๋ฐ˜ํ™˜๋˜์–ด ๋Œ์•„์˜ค๋ฉด copy_process()๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์— ์ƒˆ๋กœ ๋งŒ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์›Œ์„œ ์‹คํ–‰ํ•จ
์ปค๋„์€ ์˜๋„์ ์œผ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•จ(์ œ๋Œ€๋กœ ๋™์ž‘ ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ ์žˆ์Œ)
์ผ๋ฐ˜์ ์œผ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ”๋กœ exec() ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จผ์ € ์‹คํ–‰๋  ์‹œ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์“ฐ๊ธฐ ์ž‘์—…์ด ์ƒ๊ฒจ ๋ฐœ์ƒํ•˜๋Š” COW ์ž‘์—… ๋ง‰์„ ์ˆ˜ ์žˆ์Œ

vfork()

vfork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ๋งŒ ๋นผ๋ฉด fork()์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•จ
๋Œ€์‹  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ์†์—์„œ ๋ณ„๊ฐœ์˜ ์Šค๋ ˆ๋“œ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๊ณ , ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ exec()์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•จ
์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ
COW๋ฅผ ์ด์šฉํ•ด fork()๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์˜›๋‚  3BSD ์‹œ์ ˆ ์ƒ๋‹นํžˆ ์ข‹์€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด์—ˆ์Œ
2.6 ๋ฒ„์ „ ๊ธฐ์ค€ COW, ์ž์‹ ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์‹คํ–‰ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, vfork() ์‚ฌ์šฉ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋ณต์‚ฌ ์•ˆ ํ•˜๋Š” ๊ฒƒ๋ฟ์ž„
๋ฆฌ๋ˆ…์Šค ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋„ COW ๊ธฐ๋Šฅ ์ œ๊ณต ์‹œ ์ด ์žฅ์ ๋„ ์‚ฌ๋ผ์ง
vfork()์˜ ์ž‘๋™ ๋ฐฉ์‹ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กœ์›€(e.g. exec() ์‹คํŒจ ์‹œ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•?) ์ด์ƒ์ ์ธ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด vfork() ํ•„์š” ์—†์Œ์œผ๋กœ ์ปค๋„์—์„œ ๊ผญ ์ด๋ฅผ ๊ตฌํ˜„ ์•ˆ ํ•ด๋„ ๋จ
์ผ๋ฐ˜์ ์ธ fork() ์ด์šฉํ•ด vfork() ๊ตฌํ˜„ํ•ด๋„ ๋ฌธ์ œ ์—†์Œ, ์‹ค์ œ๋กœ 2.2 ๋ฒ„์ „ ์ปค๋„๊นŒ์ง€ ์ด ๋ฐฉ์‹ ์‚ฌ์šฉ

vfork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ํŠน๋ณ„ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ด ๊ตฌํ˜„ํ•จ

  1. copy_process()์—์„œ task_struct์˜ vfork_done ํ•ญ๋ชฉ์„ NULL๋กœ ์„ค์ •ํ•จ.
  2. ํŠน๋ณ„ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ do_fork()์—์„œ vfork_done ํฌ์ธํ„ฐ๊ฐ€ ํŠน์ • ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ.
  3. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์šฐ์„  ์‹คํ–‰์‹œํ‚จ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ vfork_done ํฌ์ธํ„ฐ ์ด์šฉํ•ด ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ.
  4. ํƒœ์Šคํฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” mm_release() ํ•จ์ˆ˜์—์„œ vfork_done ํฌ์ธํ„ฐ๊ฐ€ NULL์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•จ. NULL์ด ์•„๋‹ˆ๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์‹ ํ˜ธ ๋ณด๋ƒ„.
  5. do_fork() ํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐ€์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ๊นจ์šฐ๊ณ  ๋ฐ˜ํ™˜ํ•จ.

๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰ ์‹œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๊ณ , ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์›๋ž˜ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋จ
๋ถ€๋‹ด์€ ์ ์ง€๋งŒ ๊น”๋”ํ•œ ๊ตฌํ˜„์€ ์•„๋‹˜

๋ฆฌ๋ˆ…์Šค์˜ ์Šค๋ ˆ๋“œ ๊ตฌํ˜„

์Šค๋ ˆ๋“œ๋Š” ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ˜„๋Œ€์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•
์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์—ฌ๋Ÿฌ ๊ฐœ ๋™์‹œ์— ์‹คํ–‰ ๊ฐ€๋Šฅ
์Šค๋ ˆ๋“œ๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ ๋ฐ ๊ธฐํƒ€ ์ž์›์„ ๊ณต์œ ํ•จ
์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐconcurrent programming์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ๋‹ค์ค‘ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ง„์ •ํ•œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•จ

๋ฆฌ๋ˆ…์Šค๋Š” ๋…ํŠนํ•œ ์Šค๋ ˆ๋“œ ๊ตฌํ˜„ ๋ฐฉ์‹ ๊ฐ€์ง
๋ฆฌ๋ˆ…์Šค ์ปค๋„์—๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ๊ฐœ๋… ์—†์Œ
๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์„ธ์Šค๋กœ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„

๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž๋ฃŒ๊ตฌ์กฐ, ํŠน๋ณ„ํ•œ ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ• ์—†์Œ
๋ฆฌ๋ˆ…์Šค์˜ ์Šค๋ ˆ๋“œ๋Š” ํŠน์ • ์ž์›์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•˜๋Š” ํŠน๋ณ„ํ•œ ํ”„๋กœ์„ธ์Šค์ผ ๋ฟ
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋ณ„๋„์˜ task_struct ๊ตฌ์กฐ์ฒด ๊ฐ€์ง, ์ปค๋„ ์ž…์žฅ์—์„œ ์ฃผ์†Œ ๊ณต๊ฐ„๊ณผ ๊ฐ™์€ ์ž์›์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ์ •์ƒ์ ์ธ ํ”„๋กœ์„ธ์Šค

์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ด๋Ÿฐ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์œˆ๋„์šฐ๋‚˜ ์†”๋ผ๋ฆฌ์Šค์ฒ˜๋Ÿผ ์ปค๋„์—์„œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ(lightweigh process=๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ)๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฆ„
๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์ด๋ฆ„์ด ์‹œ์Šคํ…œ๊ฐ„ ์ฒ ํ•™์  ์ฐจ์ด ๋ณด์—ฌ์คŒ
๋ฆฌ๋ˆ…์Šค ์™ธ ๋‹ค๋ฅธ OS์—์„œ ์Šค๋ ˆ๋“œ๋Š” ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๊ฐ€๋ณ๊ณ  ๋น ๋ฅต ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฌด์–ธ๊ฐ€
๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์ž์›์„ ๊ณต์œ ํ•˜๋Š”(์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๊ฒฝ๋Ÿ‰ํ™”๋œ) ํ”„๋กœ์„ธ์Šค์— ๋ถˆ๊ณผํ•จ
e.g. ๋„ค ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค ๊ฒฝ์šฐ
๋ฆฌ๋ˆ…์Šค : ๋„ค ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค์— ๊ฐ๊ฐ ๋„ค ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž, ํ”„๋กœ์„ธ์Šค๊ฐ„ ์ผ๋ถ€ ์ž์› ๊ณต์œ 
๋‹ค๋ฅธ OS : ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์•ˆ์— ๋„ค ๊ฐœ์˜ ์Šค๋ ˆ๋“œ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด, ์ฃผ์†Œ ๊ณต๊ฐ„์ด๋‚˜ ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ ๋“ฑ ๊ณต์œ  ์ž์› ์ •๋ณด๋Š” ์„œ์ˆ ์ž ๋‚ด์— ์กด์žฌ
=> ๋ฆฌ๋ˆ…์Šค๊ฐ€ ๋งค์šฐ ๋ช…์พŒํ•œ ๊ตฌ์กฐ

์Šค๋ ˆ๋“œ ์ƒ์„ฑ

์Šค๋ ˆ๋“œ๋Š” ์ •์ƒ์ ์ธ ํƒœ์Šคํฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง
๋‹ค๋งŒ, clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹œ ํŠน์ • ์ž์› ๊ณต์œ ํ•˜๋„๋ก ํ”Œ๋ž˜๊ทธ ์ง€์ •ํ•ด์คŒ

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

์œ„์˜ ์ฝ”๋“œ๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„, ํŒŒ์ผ์‹œ์Šคํ…œ ์ž์›, ํŒŒ์ผ ์„œ์ˆ ์ž, ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๊ณต์œ ํ•œ๋‹ค๋Š” ์  ์ œ์™ธํ•˜๋ฉด ์ •์ƒ์  fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์Œ
์ฆ‰, ์ƒˆ ํƒœ์Šคํฌ์™€ ๊ทธ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ํ”ํžˆ ๋งํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ด€๊ณ„๊ฐ€ ๋จ

๋ฐ˜๋ฉด, ์ผ๋ฐ˜์ ์ธ fork()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋จ

clone(SIGHAND,0);

vfork()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋จ

clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0);

clone()์— ๋„˜๊ฒจ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์„ ์ •์˜
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„์— ๊ณต์œ ํ•  ์ž์›์„ ์ž์„ธํžˆ ์ง€์–ดํ•จ
clone์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋Š” <linux/sched.h>์— ์ •์˜๋˜์–ด ์žˆ์Œ


clone()์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ”Œ๋ž˜๊ทธ

ํ”Œ๋ž˜๊ทธ ์˜๋ฏธ
CLONE_FILES ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ ๊ณต์œ 
CLONE_FS ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ํŒŒ์ผ์‹œ์Šคํ…œ ์ •๋ณด๋ฅผ ๊ณต์œ 
CLONE_IDLETASK PID๋ฅผ 0์œผ๋กœ ์„ค์ •(์œ ํœด ์ƒํƒœ์˜ ํƒœ์Šคํฌ์—์„œ๋งŒ ์‚ฌ์šฉ)
CLONE_NEWNS ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ
CLONE_PARENT ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •
CLONE_PTRACE ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด์„œ๋„ ์ถ”์  ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”
CLONE_SETTID TID(Thread ID)๋ฅผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—๋„ ๊ธฐ๋ก
CLONE_SETTLS ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ƒˆ TLS(์Šค๋ ˆ๋“œ๋ณ„ ์ €์žฅ๊ณต๊ฐ„ thread-local storage)๋ฅผ ์ƒ์„ฑ
CLONE_SIGHAND ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๋ฐ ์‹œ๊ทธ๋„ ์ฐจ๋‹จ ์‚ฌํ•ญ์„ ๊ณต์œ 
CLONE_SYSVSEM ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ์‹œ์Šคํ…œ V SEM_UNDO ๋ฐฉ์‹์„ ๊ณต์œ 
CLONE_THREAD ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ๊ตฐ์— ์†ํ•˜๊ฒŒ ์„ค์ •
CLONE_VFORK vfork() ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊นจ์šธ ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€
CLONE_UNTRACED ์ถ”์  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์— CLONE_PTRACE๋ฅผ ์ง€์ •ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ
CLONE_STOP ํ”„๋กœ์„ธ์Šค๋ฅผ TASK_STOPPED ์ƒํƒœ์—์„œ ์‹œ์ž‘
CLONE_CHILD_CLEARTID ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ TID๋ฅผ ์ดˆ๊ธฐํ™”
CLONE_CHILD_SETTID ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ TID๋ฅผ ์„ค์ •
CLONE_PARENT_SETTID ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ TID๋ฅผ ์„ค์ •
CLONE_VM ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ„ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ณต์œ 

์ปค๋„ ์Šค๋ ˆ๋“œ

์ปค๋„๋„ ์ผ๋ถ€ ๋™์ž‘์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๋•Œ๊ฐ€ ์žˆ์Œ
์ปค๋„ ๊ณต๊ฐ„์—์„œ๋งŒ ์กด์žฌํ•˜๋Š” ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค์ธ ์ปค๋„ ์Šค๋ ˆ๋“œ ์ด์šฉํ•ด ์ด๋Ÿฐ ์ž‘์—… ๊ฐ€๋Šฅ
์ปค๋„ ์Šค๋ ˆ๋“œ์™€ ์ •์ƒ ํ”„๋กœ์„ธ์Šค๊ฐ„ ์ฃผ์š” ์ฐจ์ด์ ์€ ์ปค๋„ ์Šค๋ ˆ๋“œ์—๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„์ด ์—†๋‹ค๋Š” ์ (ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฐ€๋ฆฌํ‚ค๋Š” mm ํฌ์ธํ„ฐ๊ฐ€ NULL์ž„)
์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ์ปค๋„ ๊ณต๊ฐ„์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ์ปจํ…์ŠคํŠธ ์ „ํ™˜ ์•ˆ ์ผ์–ด๋‚จ
ํ•˜์ง€๋งŒ ์ •์ƒ ํ”„๋กœ์„ธ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปค๋„ ์Šค๋ ˆ๋“œ๋„ ์Šค์ผ€์ค„๋ง๋˜๋ฉฐ ์„ ์  ๊ฐ€๋Šฅ

๋ฆฌ๋ˆ…์Šค๋Š” ์ผ๋ถ€ ์ž‘์—…์„ ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•จ
๋Œ€ํ‘œ์ ์œผ๋กœ flush ๋ฐ ksoftirqd ์ž‘์—…์ด ์žˆ์Œ
ps -ef ๋ช…๋ น ์ด์šฉํ•˜๋ฉด ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์˜ ์ปค๋„ ์Šค๋ ˆ๋“œ ํ™•์ธ ๊ฐ€๋Šฅ
์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ๋งค์šฐ ๋งŽ์Œ
์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ๋‹ค๋ฅธ ์ปค๋„ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง
์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
๋ฆฌ๋ˆ…์Šค๋Š” kthreadd ์ปค๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋“  ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปค๋„ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌํ•จ

์ƒˆ ์ปค๋„ ์Šค๋ ˆ๋“œ ๋งŒ๋“ค๋ ค๋ฉด <linux/kthread.h>์— ์ •์˜๋œ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ

struct task_struct *kthread_create(int (*threadfn) (void *data), void *data, const char namefmt[], ...)

kthread ์ปค๋„ ํ”„๋กœ์„ธ์Šค๋Š” clone() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ์ƒˆ ํƒœ์Šคํฌ๋ฅผ ๋งŒ๋“ฆ
์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์„ธ์Šค๋Š” data ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ threadfn ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ
์ƒˆ ํ”„๋กœ์„ธ์Šค๋Š” printf ์Šคํƒ€์ผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ํ˜•์‹ํ™”ํ•œ namefmt ๋ฌธ์ž์—ด์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„ ๊ฐ€์ง
์ฒ˜์Œ ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ง
wake_up_process() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๊นจ์›Œ์ฃผ์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Œ
kthread_run() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐ”๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

struct task_struct *kthread_run(int (*threadfn) (void *data), void *data, const char namefmt[], ...)

์ด ํ•จ์ˆ˜๋Š” ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„๋˜์—ˆ๊ณ , kthread_create()์™€ wake_up_process()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜

#define kthread_run(threadfn, data, namefmt, ...)
({
	struct task_struct *k;

	k = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__);
	if (!IS_ERR(k))
		wake_up_process(k);
	k;
})

์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ํ•œ๋ฒˆ ์‹œ์ž‘๋˜๋ฉด ์Šค์Šค๋กœ do_exit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ์ปค๋„์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ kthread_create()๊ฐ€ ๋ฐ˜ํ™˜ํ•œ task_struct ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ์™€ ํ•จ๊ป˜ kthread_stop() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋จ

int kthread_stop(struct task_struct *k)

ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ปค๋„์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ž์› ๋ฐ˜๋‚ฉ ํ›„ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ ค์คŒ

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋Š” ์ž๋ฐœ์  ๋ฐœ์ƒ
ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค€๋น„๋ฌ์„ ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ exit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ๊ทธ๋žจ์˜ main ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹œ์— ๋ฌต์‹œ์ ์œผ๋กœ exit() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ(์ฆ‰ main ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณณ์— C ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ exit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…) ์ข…๋ฃŒ ์ž‘์—…์ด ์‹œ์ž‘๋จ
๋ฌผ๋ก  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋น„์ž๋ฐœ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ธฐ๋„ ํ•จ
์œ„์— ๊ฒฝ์šฐ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ๋ฌด์‹œํ•  ์ˆ˜๋„ ์—†๋Š” ์‹œ๊ทธ๋„์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•ด๋‹น
์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์ด kernel/exit.c์— ์ •์˜๋œ do_exit() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋จ

  1. task_struct ๊ตฌ์กฐ์ฒด์˜ flags ํ•ญ๋ชฉ์— PF_EXITING ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•จ.
  2. del_timer_sync() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ปค๋„ ํƒ€์ด๋จธ๋ฅผ ์ œ๊ฑฐํ•จ. ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด, ๋Œ€๊ธฐ ์ค‘์ธ ํƒ€์ด๋จธ์™€ ์‹คํ–‰ ์ค‘์ธ ํƒ€์ด๋จธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ ๋ณด์žฅ๋จ.
  3. BSD ๋ฐฉ์‹์˜ ํ”„๋กœ์„ธ์Šค ์ •๋ณด ๊ธฐ๋ก ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์‹œ do_exit() ํ•จ์ˆ˜๋Š” acct_update_integrals() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๊ด€๋ จ ์ •๋ณด ๊ธฐ๋กํ•จ.
  4. exit_mm() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” mm_struct๋ฅผ ๋ฐ˜ํ™˜ํ•จ. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์ด ์ฃผ์†Œ ๊ณต๊ฐ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด(์ด ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ณต์œ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด) ์ปค๋„์€ ํ•ด๋‹น ์ž์› ํ•ด์ œํ•จ.
  5. exit_sem() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ. ํ”„๋กœ์„ธ์Šค๊ฐ€ IPC ์„ธ๋งˆํฌ์–ด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ์ด ์‹œ์ ์— ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ํ•ด์ œ๋จ.
  6. exit_files() ๋ฐ exit_fs() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๊ด€๋ จ ํŒŒ์ผ ์„œ์ˆ ์ž ๋ฐ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ์ค„์ž„. ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ํ•ด๋‹น ์ž์›์„ ๋ฐ˜ํ™˜ํ•จ.
  7. ํƒœ์Šคํฌ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ task_struct์˜ exit_code ํ•ญ๋ชฉ์— ์ €์žฅํ•จ. exit() ํ•จ์ˆ˜์—์„œ ์ง€์ •ํ•œ ๊ฐ’, ๋˜๋Š” ์ปค๋„์˜ ์ข…๋ฃŒ ๋ฐฉ์‹์— ์˜ํ•ด ์ข…๋ฃŒ ์ฝ”๋“œ ๊ฐ’์ด ๊ฒฐ์ •๋œ๋‹ค. ์ด ๊ณณ์— ์ €์žฅ๋œ ์ข…๋ฃŒ ์ฝ”๋“œ ๊ฐ’์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.
  8. exit_notify() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์‹œ๊ทธ๋„ ๋ณด๋‚ด๊ณ , ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†ํ•œ ์Šค๋ ˆ๋“œ๊ตฐ์˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๋˜๋Š” init ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•จ. task_struct ๊ตฌ์กฐ์ฒด์˜ exit_state ํ•ญ๋ชฉ์— ํƒœ์Šคํฌ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ EXIT_ZOMBIE๋กœ ์„ค์ •ํ•จ.
  9. do_exit() ํ•จ์ˆ˜๋Š” schedule() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋กœ ์ „ํ™˜ํ•จ. ์ด์ œ ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์Šค์ผ€์ค„๋ง ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ํƒœ์Šคํฌ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ๊ฐ€ ๋จ. do_exit() ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ๊ณผ์ •์ด ์—†์Œ.

์ด ์‹œ์ ์—์„œ ํƒœ์Šคํฌ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋จ(์ด ํƒœ์Šคํฌ๋งŒ ํ•ด๋‹น ์ž์› ์‚ฌ์šฉ ์‹œ)
์ด ํƒœ์Šคํฌ๋Š” ๋” ์ด์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ณ (์‹คํ–‰ํ•  ์ฃผ์†Œ ๊ณต๊ฐ„๋„ ์—†์–ด์ง), EXIT_ZOMBIE ์ƒํƒœ๊ฐ€ ๋จ
์ข…๋ฃŒ๋œ ํƒœ์Šคํฌ๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปค๋„ ์Šคํƒ, thread_info ๊ตฌ์กฐ์ฒด, task_struct ๊ตฌ์กฐ์ฒด๊ฐ€ ์ „๋ถ€๋‹ค
์ด์ œ ํƒœ์Šคํฌ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•จ
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ปค๋„์ด ์ •๋ณด๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋˜ ๋‚˜๋จธ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋˜ ๋‚˜๋จธ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋„ ๋ฐ˜ํ™˜๋ผ ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋Œ์•„๊ฐ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์ œ๊ฑฐ

do_exit() ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข€๋น„ ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋” ์ด์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž๋Š” ์—ฌ์ „ํžˆ ๋‚จ์Œ
์ด๋Š” ์ข…๋ฃŒ ํ›„์—๋„ ์‹œ์Šคํ…œ์ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ์œ„ํ•จ
๊ฒฐ๊ตญ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ์œ„ํ•œ ์ •๋ฆฌ์ž‘์—…๊ณผ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž ์ œ๊ฑฐ ์ž‘์—…์€ ๋ถ„๋ฆฌ๋œ ๋ณ„๋„์˜ ์ž‘์—…
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ปค๋„์ด ํ•ด๋‹น ์ •๋ณด๊ฐ€ ํ•„์š” ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋ฉด, ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ task_struct ๊ตฌ์กฐ์ฒด์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋จ

wait() ๊ณ„์—ด ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ณต์žกํ•œ wait4() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ
๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ •์ง€์‹œํ‚ค๋Š” ๊ฒƒ, ์ข…๋ฃŒ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID ๊ฐ’์„ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๊ฐ€์ง
๋˜ํ•œ ์ข…๋ฃŒ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ํฌ์ธํ„ฐ๋„ ์ œ๊ณตํ•จ

ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋˜๋ฉด release_task() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ

  1. __exit_signal() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜๋Š” __unhash_process() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ด์–ด์„œ detach_pid() ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ pidhash์™€ ํƒœ์Šคํฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•จ.
  2. __exit_signal() ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋‚จ์€ ์ž์› ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ†ต๊ณ„๊ฐ’๊ณผ ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•จ.
  3. ํ•ด๋‹น ํƒœ์Šคํฌ๊ฐ€ ์Šค๋ ˆ๋“œ๊ตฐ์˜ ๋งˆ์ง€๋ง‰ ์Šค๋ ˆ๋“œ์˜€๋‹ค๋ฉด ๋Œ€ํ‘œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข€๋น„๊ฐ€ ๋œ ๊ฒƒ์ด๋ฏ€๋กœ, release_task() ํ•จ์ˆ˜๋Š” ๋Œ€ํ‘œ ์Šค๋ ˆ๋“œ์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์ด ์‚ฌ์‹ค์„ ์•Œ๋ฆผ
  4. release_task() ํ•จ์ˆ˜๋Š” put_task_struct() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋„ ์Šคํƒ ๋ฐ thread_info ๊ตฌ์กฐ์ฒด๊ฐ€ ๋“ค์–ด ์žˆ๋˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , task_struct ๊ตฌ์กฐ์ฒด๊ฐ€ ๋“ค์–ด ์žˆ๋˜ ์Šฌ๋žฉ ์บ์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•จ

์ด ์‹œ์ ์—์„œ ํ”„๋กœ์„ธ์Šค ์„œ์ˆ ์ž์™€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  ์ž์›์ด ํ•ด์ œ๋จ

๋ถ€๋ชจ ์—†๋Š” ํƒœ์Šคํฌ์˜ ๋”œ๋ ˆ๋งˆ

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋จผ์ € ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ๋กœ ์ง€์ •ํ•˜๋Š” ์ˆ˜๋‹จ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•จ
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋ถ€๋ชจ๋ฅผ ์žƒ๊ณ  ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๋Š” ์˜์›ํžˆ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚จ์•„ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋จ
ํ•ด๊ฒฐ์ฑ…์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†ํ•œ ์Šค๋ ˆ๋“œ๊ตฐ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ์—” init ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ

do_exit() ํ•จ์ˆ˜๋Š” exit_notify() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜์—์„œ forget_original_parent() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ, ์—ฌ๊ธฐ์„œ find_new_reaper() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด ๊ณณ์—์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ์žฌ์ง€์ •์ด ์ฒ˜๋ฆฌ๋จ

static struct task_struct *find_new_reaper(struct task_struct *father)
{
	struct pid_namespace *pid_ns = task_active_pid_ns(father);
	struct task_struct *thread;

	thread = father;
	while_each_thread(father, thread) {
		if (thread->flags & PF_EXITING)
			continue;
	
	if (unlikely(pid_ns->child_reaper == father))
		pid_ns->child_reaper = thread;
	return thread;
	}

	if (unlikely(pid_ns->child_reaper == father)) {
		write_unlock_irq(&tasklist_lock);
		if (unlikely(pid_ns == &init_pid_ns))
			panic("Attempted to kill init!");

		zap_pid_ns_processes(pid_ns);
		write_lock_irq(&tasklist_lock);

		// child_reaper ํ•ญ๋ชฉ์„ ๊ทธ๋Œ€๋กœ ๋‘๊ฑฐ๋‚˜ ๊ทธ๋ƒฅ ์ง€์›Œ๋ฒ„๋ฆด ์ˆ˜ ์—†์Œ
		// children ํฌ์ธํ„ฐ ๋‚ด์šฉ ์ค‘์— EXIT_DEAD ์ƒํƒœ์ธ ํƒœ์Šคํฌ๊ฐ€
		// ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, forget_original_parent() ํ•จ์ˆ˜๋Š”
		// ์ด๋“ค์„ ์–ด๋”˜๊ฐ€๋กœ ์˜ฎ๊ฒจ์•ผ ํ•จ

		pid_ns->child_reaper = init_pid_ns.child_reaper;
	}
	return pid_ns->child_reaper;
}

์œ„์˜ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†ํ•œ ์Šค๋ ˆ๋“œ๊ตฐ์˜ ๋‹ค๋ฅธ ํƒœ์Šคํฌ๋ฅผ ์ฐพ์•„๋ด„
๋งŒ์•ฝ ์Šค๋ ˆ๋“œ๊ตฐ์— ๋‹ค๋ฅธ ํƒœ์Šคํฌ๊ฐ€ ์—†๋‹ค๋ฉด init ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•จ
์œ„ ์ฝ”๋“œ๋กœ ์ƒˆ ๋ถ€๋ชจ๋ฅผ ์ฐพ์•˜์œผ๋‹ˆ, ๋ชจ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ reaper๋กœ ๋‹ค์‹œ ์ง€์ •ํ•ด์ฃผ๋Š” ์ž‘์—… ํ•„์š”ํ•จ

reaper = find_new_reaper(father);
list_for_each_entry_safe(p, n, &father->children, sibling) {
	p->real_parent = reaper;
	if (p->parent == father) {
		BUG_ON(p->ptrace);
		p->parent = p->real_parent;
	}
	reparent_thread(p, father);
}

๊ทธ ๋‹ค์Œ ptrace_exit_finish() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ถ”์  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์ง€์ •ํ•ด์คŒ

void exit_ptrace(struct task_struct *tracer)
{
	struct task_struct *p, *n;
	LIST_HEAD(ptrace_dead);

	write_lock_irq(&tasklist_lock);
	list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry){
		if (__ptrace_detach(tracer, p))
			list_add(&p->ptrace_entry, &ptrace_dead);
	}
	write_unlock_irq(&tasklist_lock);

	BUG_ON(!list_empty(&tracer->ptraced));

	list_for_each_entry_safe(p, n, &ptrace_dead, ptrace_entry) {
		lsit_del_init(&p->ptrace_entry);
	release_task(p);
	}
}

์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ์™€ ์ถ”์  ๋ฆฌ์ŠคํŠธ ๋‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ๊ฒฝ์ด ์žˆ์Œ
ํƒœ์Šคํฌ๊ฐ€ ์ถ”์  ์ƒํƒœ์— ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋Š” ๋””๋ฒ„๊น… ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ์ž„์‹œ ๋ณ€๊ฒฝํ•จ
๊ทธ๋Ÿฌ๋‚˜ ํƒœ์Šคํฌ์˜ ์› ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด, ๋‹ค๋ฅธ ํ˜•์ œ ํ”„๋กœ์„ธ์Šค์™€ ๊ฐ™์ด ์ƒˆ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
์ด์ „ ์ปค๋„์—์„œ๋Š” ์ด๋Ÿฐ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ์กฐ์‚ฌํ•จ
์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด ์ถ”์  ์ƒํƒœ์— ์žˆ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•
์ด๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง€๋˜ ์ž‘์—…์„ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์ž‘์—…์œผ๋กœ ์ค„์ž„

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์ง€์ •ํ•˜๋ฉด, ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ์•„ ์žˆ์„ ์œ„ํ—˜์„ฑ ์‚ฌ๋ผ์ง
init ํ”„๋กœ์„ธ์Šค๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ wait() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ž์‹ ์—๊ฒŒ ํ• ๋‹น๋œ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •๋ฆฌํ•จ